#include <stdio.h>
#include <string.h>
#include  <stddef.h>
#include <jpeglib.h>
#include "./readbitmap.h"
#include "defs.h"

#include "memory.h"
//
char  yuvYstr[5000] =" \
28	27	24	25	24	23	23	25	33	96	154	151	139	147	182	221	234	237	235	236	241	243	240	246	244	239	241	239	237	232	237	229 \
52	58	58	50	52	50	51	51	57	111	156	152	132	149	202	230	228	219	225	232	229	234	233	229	234	229	216	207	200	199	199	199 \
89	91	95	91	92	91	92	99	106	118	130	126	126	154	190	209	207	206	209	209	209	211	214	213	210	205	193	193	192	188	187	188 \
117	117	117	117	117	117	122	123	132	141	141	146	145	156	180	195	192	195	187	191	196	192	200	199	192	188	185	178	176	167	165	176 \
151	148	148	147	141	146	151	151	148	146	148	150	154	161	173	180	176	173	170	169	172	173	172	174	173	169	167	156	153	148	153	147 \
159	157	158	157	158	157	157	163	163	166	173	173	174	175	169	156	155	153	149	148	152	155	151	154	150	150	138	152	141	140	139	134 \
187	183	181	177	173	170	170	171	176	176	173	178	183	187	175	154	145	142	142	137	133	136	128	133	131	131	131	131	130	130	133	126 \
199	196	196	196	198	195	195	196	194	194	197	194	193	203	196	169	147	135	126	126	123	120	128	129	122	127	122	128	121	126	120	122 \
218	213	209	209	202	203	202	194	194	194	194	201	210	213	219	210	178	141	126	125	121	114	114	119	129	114	117	130	117	131	117	131 \
213	212	210	206	206	203	201	200	200	205	209	208	211	216	222	227	219	192	156	124	118	116	116	121	116	121	112	109	113	116	110	106 \
218	213	207	207	208	206	206	206	206	201	201	210	210	214	219	225	235	228	213	197	159	105	96	97	88	88	87	83	86	75	75	71  \
213	211	206	202	197	191	188	190	192	195	200	203	208	210	217	224	224	234	239	233	213	153	90	71	74	77	76	78	76	74	77	73\
219	217	211	208	205	197	193	190	187	189	193	198	206	210	216	217	217	225	236	234	221	167	96	75	74	74	75	78	74	73	82	73\
210	208	209	208	203	196	199	201	197	197	202	209	208	213	220	224	230	236	239	241	229	178	98	81	87	90	90	90	87	89	134	89\
200	196	197	205	198	190	190	190	190	181	183	193	194	204	216	226	230	233	239	243	237	187	115	103	100	102	102	103	102	121	186	139 \
195	185	175	166	171	168	168	169	162	169	175	178	190	195	200	198	199	212	210	207	214	188	117	106	104	104	106	112	126	175	205	190 \
221	213	200	189	182	174	171	172	174	181	187	193	199	199	208	223	232	235	240	240	234	194	131	105	104	104	106	109	145	193	204	208 \
231	223	219	213	200	194	194	190	179	179	189	194	194	200	213	225	236	239	246	246	240	207	153	131	127	99	89	106	144	187	225	205 \
205	205	199	198	196	191	189	189	191	191	191	194	200	210	211	215	221	229	237	242	242	224	187	144	133	120	108	94	97	132	205	217 \
203	190	182	171	163	158	161	167	174	187	194	199	211	217	222	232	231	232	237	244	245	233	195	146	143	136	114	109	99	107	197	213 \
188	183	182	176	173	177	177	168	163	165	170	178	184	192	202	212	222	233	237	244	246	235	199	157	148	153	144	135	112	110	164	214 \
200	196	192	192	184	175	173	178	189	198	200	196	197	202	200	205	213	225	237	243	246	240	214	166	158	151	144	142	127	114	150	221 \
224	207	194	193	207	215	208	204	201	196	193	192	205	225	233	232	231	239	246	246	246	242	220	172	167	163	154	162	152	148	161	197 \
224	224	222	222	218	208	203	202	207	205	204	205	206	216	222	230	237	242	246	246	246	244	229	185	159	148	146	153	150	152	153	183 \
191	187	181	183	187	190	197	209	219	219	219	226	232	224	225	229	225	239	246	246	246	246	236	196	153	151	145	145	149	162	155	170 \
223	212	202	193	185	172	169	171	167	171	179	188	203	213	222	230	236	242	246	246	246	246	242	213	153	132	134	135	155	159	154	143 \
219	206	204	200	190	186	178	175	178	181	188	197	207	211	217	224	234	239	246	246	246	246	246	235	190	144	142	140	145	155	161	147 \
220	212	205	196	190	181	175	173	177	189	198	205	212	219	225	236	239	246	246	246	246	244	239	231	205	167	153	157	160	154	156	144 \
232	222	217	214	204	192	185	183	184	186	190	200	209	216	228	231	239	246	246	246	240	226	216	200	192	175	168	165	155	159	145	144 \
235	229	222	212	208	200	192	192	194	194	200	210	214	219	225	236	240	246	246	240	219	188	163	167	158	155	149	134	136	137	137	134 \
212	207	204	198	192	187	179	179	187	189	194	206	216	219	225	237	242	246	246	242	227	193	148	125	109	99	90	93	94	94	96	90 \
229	219	219	210	194	172	161	158	158	161	168	184	200	213	225	233	235	246	246	246	246	246	246	233	180	134	118	122	122	122	122	122";

void read_block32x32fromString(char * str){
    char * delim=" ";
    char * p;
    p=strtok(str,delim);
    printf("%s- ",p);
    while(p!=NULL){
        printf("%s- ",p);
        p=strtok(NULL,delim);
    }

    
}
void print3Arr(int *** arr){
    printf("----------print ARR----------\n");
    int k=0,i=0,j=0;
    for(k=0;k<3;k++){
        for(i=0;i<block32;i++){
            for(j=0;j<block32;j++){
                printf("%d  ",arr[i][j][k]);
            }
            printf("\n");
        }
        printf("--------------------\n");
    }
}

void print3Arr_K(int *** arr,int k){
    printf("----------print ARR----------\n");
    int i=0,j=0;

        for(i=0;i<block32;i++){
            for(j=0;j<block32;j++){
                printf("%d  ",arr[i][j][k]);
            }
            printf("\n");
        }
        printf("--------------------\n");
   
}
int  test_one_block()
{
    //图片2272
    BmpInfo *bmp = readBmp("../data/dump_image/tmpfs/2272.bmp");

    int **BlockPosition = (int **)calloc_mat_int(DY, 2);
    int ***rgbData = (int ***)calloc_mat_int3(DY,DX,4);
    int ***yuvData = (int ***)calloc_mat_int3(DY,DX,3);
    int **yuv_yData = (int **)calloc_mat_int(DY,DX);
    getBlockPosition(BlockPosition,X1,Y1,X2,Y2);
    getBlockRgbaData(bmp->rgbData, BlockPosition, rgbData, DY);
    getYuvfromRgb(rgbData, yuvData,block32,block32);
    
    // print3Arr(rgbData);
    // print3Arr(yuvData);

    //图片2273
      BmpInfo *bmp1 = readBmp("../data/dump_image/tmpfs/2273.bmp");

    int **BlockPosition1 = (int **)calloc_mat_int(DY, 2);
    int ***rgbData1 = (int ***)calloc_mat_int3(DY,DX,4);
    int ***yuvData1 = (int ***)calloc_mat_int3(DY,DX,3);
    int **yuv_yData1 = (int **)calloc_mat_int(DY,DX);
    getBlockPosition(BlockPosition1,X1,Y1,X2,Y2);
    getBlockRgbaData(bmp1->rgbData, BlockPosition1, rgbData1, DY);
    getYuvfromRgb(rgbData1, yuvData1,block32,block32);
    // print3Arr(rgbData1);
    
    //YUV残差
    int ***yuv_residual=(int ***)calloc_mat_int3(DY,DX,3);
    caculateMBResidual(yuvData,yuvData1,yuv_residual,block32,block32);
    // print3Arr(yuv_residual);

    //RGB残差
     int ***rgb_residual=(int ***)calloc_mat_int3(DY,DX,3);
    caculateMBResidual(rgbData,rgbData1,rgb_residual,block32,block32);
    // print3Arr(rgb_residual);

    //压缩YUV残差
    compress_Block(yuv_residual,"./tmp/yuv_residual.jpg");
    //压缩YUV
    // compress_Block(yuvData,"./tmp/yuv.jpg");
    //压缩RGB
    // compress_Block(rgbData,"./tmp/rgb.jpg");
    //压缩rgb残差
    compress_Block(rgb_residual,"./tmp/rgb_residual.jpg");

  
    // print3Arr_K(rgbData1,0);
    // print3Arr_K(rgb_residual,0);
    // printData(rgbData);
    unsigned char *de_data=decompressOneBlock("./tmp/rgb.jpg");
    print3Arr_K(rgbData,0);
    printData(de_data,0);
    printf("\n");
    print3Arr_K(rgbData,1);
    printData(de_data,1);
    printf("\n");
    print3Arr_K(rgbData,2);
    printData(de_data,2);
    printf("\n");
    print3Arr(rgb_residual);
    return 0;
}

void test_similar_block(){
    int *** block=readBlock("./block.input");
    int *** block1=readBlock("./block_input_1");
    // print3Arr(block);
    //RGB残差
    int ***rgb_residual=(int ***)calloc_mat_int3(DY,DX,3);
    caculateMBResidual(block1,block,rgb_residual,block32,block32);
    //
    print3Arr(rgb_residual);

    //压缩RGB
    compress_Block(block,"./tmp/rgb_block.jpg");
    //压缩rgb残差
    compress_Block(rgb_residual,"./tmp/rgb_block_residual.jpg");

}

void test_block_residual(){
    int *** block=readBlock("./block_residual");
    compress_Block(block,"./tmp/rgb_block_residual_pos.jpg");

    int *** block_neg=readBlock("./block_residual");
    compress_Block(block_neg,"./tmp/rgb_block_residual_neg.jpg");

    int *** block_mix=readBlock("./block_residual_mix");
    compress_Block(block_mix,"./tmp/rgb_block_residual_mix.jpg");
}
